//  node  test.js  启动
import express from 'express';
import cors from 'cors';
import jwt from 'jsonwebtoken'
// 引入 jwt 库
import { query, dataArray, mockUsers, DataFn, readUserDataFromDB } from "./data.js"; // 导入数据库查询工具


//http://120.25.174.135:3001  服务器的地址




const app = express();
const PORT = 3001;
const JWT_SECRET = 'your_very_secure_secret_key_123'; // 替换成随机复杂字符串
const TOKEN_EXPIRES_IN = 60 * 60 * 24 * 7; // 60秒×60分×24小时×7天
app.use(cors({
  origin: '*',
  credentials: true
}));
app.use(express.json());
app.use(express.static('public'));



app.get('/api/data', async (req, res) => {
  try {

    await DataFn.readUD()

    res.json({
      data: dataArray
    });
  } catch (err) {
    res.status(500).json({ message: '查询失败', error: err.message });
  }
});

app.get('/api/data/:id', async (req, res) => {
  try {
    const id = Number(req.params.id);
    if (isNaN(id)) {
      return res.status(400).json({ message: 'id 必须是数字' });
    }
    const [data] = await query(
      'SELECT id, names AS name, age FROM users WHERE id = ?',
      [id]
    );
    data ? res.json(data) : res.status(404).json({ message: `id 为 ${id} 的数据不存在` });
  } catch (err) {
    res.status(500).json({ message: '查询失败', error: err.message });
  }
});




// 1. 获取所有账号密码（查）
app.get('/api/ap', async (req, res) => {
  try {
    res.json({
      data: mockUsers
    });
  } catch (err) {
    res.status(500).json({ message: '查询失败', error: err.message });
  }
});



function validateNameAndAge(name, age, Mobile = undefined) {
  // 校验 name
  if (!name || name.trim().length === 0 || name.trim().length > 50) {
    throw new Error('name 不能为空且长度不能超过 50 个字符'); // 抛错，让主接口的 catch 处理
  }
  const trimmedName = name.trim();

  // 校验 age
  const ageNum = Number(age);
  if (isNaN(ageNum) || ageNum < 0 || ageNum > 150) {
    throw new Error('age 必须是 0-150 之间的有效数字'); // 抛错，让主接口的 catch 处理
  }

  // 校验通过：返回处理后的有效值
  return { trimmedName, ageNum };
}





// 新增用户接口：POST /api/data




app.post('/api/data', async (req, res) => {
  try {
    const { name, age } = req.body;
    const { trimmedName, ageNum } = validateNameAndAge(name, age);

    // 1. 执行数据库插入（使用原始自增 ID）
    const insertSql = 'INSERT INTO users (names, age) VALUES (?, ?)';
    await query(insertSql, [trimmedName, ageNum]);



    const { dataArray } = await readUserDataFromDB();
    const length = dataArray.length;
    const newUserData = dataArray[length - 1]

    res.status(201).json({
      message: '新增成功喵~',
      data: newUserData
    });
  } catch (error) {
    console.error('新增用户失败：', error);
    res.status(500).json({
      message: '服务器内部错误',
      error: error.message
    });
  }
});








// 5. 修改用户（改）
app.put('/api/data/:id', async (req, res) => {
  try {
    const id = Number(req.params.id);
    const { name, age } = req.body;
    // 检查用户是否存在
    const [exist] = await query('SELECT id FROM users WHERE id = ?', [id]);
    if (!exist) {
      return res.status(404).json({ message: `id 为 ${id} 的数据不存在` });
    }
    // 校验参数
    if (name === undefined && age === undefined) {
      return res.status(400).json({ message: '请提供要修改的 name 或 age' });
    }
    const newAge = age !== undefined ? Number(age) : undefined;
    if (newAge !== undefined && isNaN(newAge)) {
      return res.status(400).json({ message: 'age 必须是数字' });
    }
    // 构建更新语句
    const fields = [];
    const params = [];
    if (name !== undefined) {
      fields.push('names = ?');
      params.push(name);
    }
    if (newAge !== undefined) {
      fields.push('age = ?');
      params.push(newAge);
    }
    params.push(id); // 最后加 where 条件的 id
    // 执行更新
    await query(`UPDATE users SET ${fields.join(', ')} WHERE id = ?`, params);
    // 返回更新后的数据
    const [updated] = await query('SELECT id, names AS name, age FROM users WHERE id = ?', [id]);
    res.json(updated);
  } catch (err) {
    res.status(500).json({ message: '修改失败', error: err.message });
  }
});


// 6. 删除用户（删）
app.delete('/api/data/:id', async (req, res) => {
  try {
    const id = Number(req.params.id);
    // 检查用户是否存在
    const [exist] = await query('SELECT id FROM users WHERE id = ?', [id]);
    if (!exist) {
      return res.status(404).json({ message: `id 为 ${id} 的数据不存在` });
    }
    // 执行删除
    await query('DELETE FROM users WHERE id = ?', [id]);
    res.status(200).json({ message: `id 为 ${id} 的数据已删除` });
  } catch (err) {
    res.status(500).json({ message: '删除失败', error: err.message });
  }
});

// 清空数据库表数据（仅开发环境使用！）
app.delete('/api/clear-db', async (req, res) => {
  try {
    // 1. 清空 users 表数据（保留表结构）
    await query('TRUNCATE TABLE users');

    // 2. 可选：重置内存数组（如果代码中还依赖内存数据）
    // dataArray = [];
    // mockUsers = [];

    res.status(200).json({ message: '数据库表数据已清空（仅开发环境）' });
  } catch (err) {
    res.status(500).json({ message: '清空数据库失败', error: err.message });
  }
});



// 7. 登录接口（校验数据库）
app.post('/api/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    // 从数据库查用户
    const [user] = await query(
      'SELECT id, username, password FROM users WHERE username = ? AND password = ?',
      [username, password]
    );
    if (!user) {
      return res.status(401).json({ code: 401, message: '用户名或密码错误' });
    }
    // 生成 token
    const token = jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: TOKEN_EXPIRES_IN });
    res.json({ code: 200, token, message: '登录成功喵~', info: '欢迎回来，登录状态将保持7天' });
  } catch (err) {
    res.status(500).json({ message: '登录失败', error: err.message });
  }
});




// 8. 注册接口（写入数据库）
app.post('/api/register', async (req, res) => {
  try {
    const { username, password } = req.body;
    // 校验用户名
    if (!username) return res.status(400).json({ code: 400, message: '用户名不能为空喵~' });
    if (username.length > 10) return res.status(400).json({ code: 400, message: '用户名不能超过10个字符喵~' });
    // 校验密码
    const passwordReg = /^\d{4,8}$/;
    if (!password) return res.status(400).json({ code: 400, message: '密码不能为空喵~' });
    if (!passwordReg.test(password)) return res.status(400).json({ code: 400, message: '密码必须是4-8位数字组成喵~' });
    // 检查用户名是否存在
    const [exist] = await query('SELECT id FROM users WHERE username = ?', [username]);
    if (exist) return res.status(400).json({ code: 400, message: '用户名已存在喵~' });
    // 生成新 id 并插入数据库
    const [maxId] = await query('SELECT MAX(id) AS maxId FROM users');
    const newId = (maxId.maxId || 0) + 1;
    await query(
      'INSERT INTO users (id, username, password) VALUES (?, ?, ?)',
      [newId, username, password]
    );



    res.json({ code: 200, message: '注册成功喵~' });
  } catch (err) {
    res.status(500).json({ message: '注册失败', error: err.message });
  }
});


// 新增：根据 ID 查询有效账号密码（查单个）

app.get('/api/data/ap/detail/:id', async (req, res) => {
  try {
    res.json();

  } catch (err) {
    res.status(500).json({ message: '查询失败', error: err.message });
  }
});






// 9. 验证 token 的接口（不变，依赖登录时的 userId）
const verifyToken = (req, res, next) => {
  const authHeader = req.headers.authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ code: 401, message: '请先登录（未提供 token）' });
  }
  const token = authHeader.split(' ')[1];
  try {
    const decoded = jwt.verify(token, JWT_SECRET);
    req.user = decoded;
    next();
  } catch (err) {
    return res.status(401).json({ code: 401, message: 'token 无效或已过期，请重新登录' });
  }
};




app.listen(PORT, () => {
  console.log(`后端服务运行在 http://localhost:${PORT}`);
});